import Queue from '@/sources/Queue/doubleQueue'
import { IStack } from "./types";

export default class Stack<T = number> implements IStack<T> {
    private queue: Queue<T>
    constructor() {
        this.queue = new Queue();
    }

    /**
     * 获取栈中元素的数量
     */
    size() {
        return this.queue.size();
    }

    /**
     * 判断栈是否为空
     */
    isEmpty() {
        return this.size() === 0;
    }

    /**
     * 入栈
     * @param element 
     */
    push(element: T) {
        this.queue.enQueue(element);
    }

    /**
     * 出栈
     */
    pop() {
        return this.queue.deTailQueue();
    }

    /**
     * 获取栈顶元素
     */
    top() {
        return this.queue.getLastEle()!
    }

    /**
     * 遍历栈
     * @param cb 
     */
    forEach(cb: (ele: T, i: number) => boolean) {
        this.queue.forEach((ele, i) => {
            cb(ele, i)
        })
    }

    /**
     * 清空栈
     */
    clear() {
        this.queue.clear()
    }
} 